<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow-IPC: session/session.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow-IPC<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow-IPC project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_938858dd290fe54e59e3500689c41d32.html">session</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">session.hpp</div></div>
</div><!--header-->
<div class="contents">
<a href="ipc__session_2src_2ipc_2session_2session_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow-IPC: Sessions</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="session__fwd_8hpp.html">ipc/session/session_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &quot;ipc/session/schema/common.capnp.h&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="preprocessor">#include &quot;<a class="code" href="heap__serializer_8hpp.html">ipc/transport/struc/heap_serializer.hpp</a>&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="preprocessor">#include &lt;experimental/propagate_const&gt;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span> </div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceipc_1_1session.html">ipc::session</a></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span>{</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span> </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span><span class="comment">// Types.</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span><span class="preprocessor">#ifdef IPC_DOXYGEN_ONLY </span><span class="comment">// Not compiled: for documentation only.  Contains concept docs as of this writing.</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span><span class="comment"></span> </div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span><span class="comment">/**</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment"> * A documentation-only *concept* defining the local side of an IPC conversation (*session*)</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment"> * with another entity (typically a separate process), also represented by a Session-implementing object,</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="comment"> * through which one can easily open IPC channels (ipc::transport::Channel), among other IPC features.</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span><span class="comment"> * While it is possible to open a `Channel` without the help of this Session concept, for many users writing</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="comment"> * large multi-channel applications it would be too laborious to do so.  The Session concept is the central</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="comment"> * one in ipc::session.</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span><span class="comment"> *</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="comment"> * @see ipc::session doc header.</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="comment"> * @see Session_mv which implements the majority of Session concept, namely when it is in PEER state.</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment"> *</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span><span class="comment"> * ### Concept contents ###</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment"> * The concept defines the following behaviors/requirements.</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment"> *   - The object has at least 2 states:</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment"> *     - NULL: Object is not a peer: is not open/capable of operation.  Essentially it is not a useful</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="comment"> *       state.  A default-cted object is in NULL state; and a moved-from object is as-if default-cted, therefore</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="comment"> *       also in a NULL state.  In this state all the transmission-related methods return `false`/sentinel and no-op.</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span><span class="comment"> *     - PEER: Object is or has been a peer (open/capable of operation).  It is not possible to exit PEER</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="comment"> *       state, except via being moved-from.  The session ending, such as due to the partner process exiting,</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span><span class="comment"> *       retains PEER state for instance.</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="comment"> *     - Other states are allowed but outside the scope of the concept.  For example a CONNECTING state may or may</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="comment"> *       not be relevant (but again not relevant to this concept).</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span><span class="comment"> *   - Active-opening a channel: open_channel().  See its doc header.  It yields a PEER-state #Channel_obj.</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span><span class="comment"> *   - Passive-opening a channel (the counterpart to the partner Session&#39;s open_channel()).</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span><span class="comment"> *     - At entry to PEER state (the mechanism of accomplishing which, as noted below, is not specified by the concept)</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span><span class="comment"> *       the user must have provided a passive-open handler (discussed below in detail) via which subsequent</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="comment"> *       passive-opens are reported to the user.  To this handler a PEER-state #Channel_obj is passed in case of</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="comment"> *       success.</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="comment"> *     - Alternatively, if at entry to PEER state the user has chosen to *not* supply a passive-open handler,</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span><span class="comment"> *       then the partner Session::open_channel() shall yield failure.  In this mode of operation, the user has</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span><span class="comment"> *       chosen this side of the session to not act as a passive-opener.  (If both `Session`s do so, the session</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span><span class="comment"> *       is essentially useless.  Formally this is supported, simply because there is no need to enforce otherwise.)</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="comment"> *   - Async error reporting: At entry to PEER state (the mechanism of accomplishing which, as noted below, is not</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span><span class="comment"> *     specified by the concept) the user must have provided an on-error handler via which asynchronously-occurring</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span><span class="comment"> *     session-hosing #Error_code are reported.  See details below.</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span><span class="comment"> *   - The (outgoing) transmission-of-messages methods, including transmission of graceful-close message.</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span><span class="comment"> *     See their doc headers.</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span><span class="comment"> *   - Behavior when the destructor is invoked.  See ~Session() doc header.</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span><span class="comment"> *   - Default ctor (which creates a NULL-state object that can be moved-to and to which &quot;as-if&quot;</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span><span class="comment"> *     state any moved-from object is changed).</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span><span class="comment"> *   - Move ctor, move assigment operator; these do the reasonable thing including setting the moved-from object</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span><span class="comment"> *     to NULL state.  Various satellite APIs (e.g., Session_server) may</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment"> *     need these.  That is such APIs do not rely on the factory/shared-ownership pattern.</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment"> *</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment"> * The concept (intentionally) does *not* define the following behaviors:</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span><span class="comment"> *   - How to create a Session, except the default and move ctors.</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span><span class="comment"> *     That is it does not define how to create a *new* (not moved-from) and *functioning* (PEER state:</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span><span class="comment"> *     open/capable of communication) peer object.  It only defines behavior once the user has access to</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span><span class="comment"> *     a Session that is already in PEER state: connected to an opposing peer Session.</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="comment"> *</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span><span class="comment"> * ### Async-I/O channels versus `sync_io` ones ###</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span><span class="comment"> * There are 3, overall, ways to obtain a transport::Channel via ipc::session.</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span><span class="comment"> *   - Session::open_channel().  It&#39;s a synchronous operation; it sets a `Channel` as a pointer out-arg.</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="comment"> *   - Passive-opening.  It&#39;s an async operation via passive-open handler (see below for details).</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment"> *   - Init-channels.  Client_session_mv::sync_connect() (et al) and Session_server::async_accept() (et al)</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment"> *     provide ways to pre-open channels to be ready the moment the session enters PEER state.</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment"> *</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment"> * In all cases these channels shall bear `sync_io`-pattern peer objects: not async-I/O ones.</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span><span class="comment"> *   - They are lighter-weight to create and pass around.</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span><span class="comment"> *   - They can be immediately fed to transport::struc::Channel or transport::struc::sync_io::Channel ctor</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span><span class="comment"> *     via `move()` semantics.</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span><span class="comment"> *   - They can be trivially upgraded to async-I/O form via transport::Channel::async_io_obj().</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span><span class="comment"> *</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span><span class="comment"> * ### Thread safety and handler invocation semantics ###</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span><span class="comment"> * As is typical: 2 different Session objects are safe to invoke methods on concurrently; it is not safe to</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="comment"> * invoke a non-`const` method on a given `*this` concurrently to any other method on the same `*this`.</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span><span class="comment"> *</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span><span class="comment"> * The handlers -- namely the passive-open handler (optional) and the on-error handler (mandatory) -- shall be</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span><span class="comment"> * invoked from some unspecified thread that is not any one of the user&#39;s calling threads.  It is *not* allowed</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span><span class="comment"> * to invoke `*this` APIs from within any such handler.  For example, you may not open_channel() from</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span><span class="comment"> * the passive-open handler.  Informally, it is recommended that any user handler post its actual handling of the</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span><span class="comment"> * event onto their own thread(s), such as via `flow::async::Single_thread_task_loop::post()`.</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span><span class="comment"> *</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="comment"> * ### Passive-open handler semantics ###</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span><span class="comment"> * As summarized above, a Session -- at entry to PEER state -- is optionally capable of accepting the partner</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span><span class="comment"> * Session&#39;s active-open (open_channel()) attempt.  The user must make the decision whether to be capable or</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span><span class="comment"> * incapable of performing such a passive-open.  If they decide the latter, they must not set the *on-passive-open*</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="comment"> * handler; else they must set it by the time PEER state begins.  (The mechanism of doing so is unspecified by</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment"> * the concept.  The current impls, #Server_session and #Client_session, use different APIs for this.)</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span><span class="comment"> *</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span><span class="comment"> * If the choice is made to indeed perform passive-opens (accept other side&#39;s active-opens), then suppose the</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span><span class="comment"> * handler H is indeed saved inside `*this` (which is in PEER state).  Then the following shall be invoked from some</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span><span class="comment"> * unspecified thread that is not one of the user&#39;s public API-invoking threads: `H(C, M)`, where `C` is a</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span><span class="comment"> * #Channel_obj onto which the new PEER-state transport::Channel shall be `move()`d; while `M` is the metadata reader</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span><span class="comment"> * (explained below).  Therefore the H signature must be compatible with:</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span><span class="comment"> *</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment"> *   ~~~</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment"> *   void H(Channel_obj&amp;&amp; new_peer_channel, Mdt_reader_ptr&amp;&amp; metadata_reader)</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment"> *   ~~~</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span><span class="comment"> *</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment"> * Note that #Mdt_reader_ptr is a `shared_ptr` to a capnp-generated `Reader` to a capnp-`struct`</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment"> * parameterized on #Mdt_payload_obj.  The memory resources taken by the serialization of the metadata</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span><span class="comment"> * (including certain internal zero-copy &quot;baggage&quot;) shall be freed once that `shared_ptr` ref-count group is empty.</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span><span class="comment"> * As for what the heck this even *is*: see open_channel()&#39;s metadata arg docs.  This is the `Reader` counterpart</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment"> * to the `Builder` mutated by the opposing open_channel() caller.</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><span class="comment"> *</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span><span class="comment"> * ### Open channel metadata ###</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span><span class="comment"> * open_channel() is used to initiate a channel opening on one side, and the on-passive-open handler is used</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span><span class="comment"> * to accept the same on the other side (for a given channel).  The result, on each side, is a #Channel_obj,</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span><span class="comment"> * which is a `Channel` template instantiation.  Note that it is not a `struc::Channel`; the user may choose</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span><span class="comment"> * to immediate convert `Channel` to `struc::Channel` via std::move(), but whether they want to or not is up</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span><span class="comment"> * to them and their desired use case.  Now, there are millions of patterns of what the acceptor might want</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span><span class="comment"> * to accept in a session; there could be one channel for some app-wide updates and one per processor core;</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span><span class="comment"> * and possibly more differentiation than that regarding which channel is for what purpose.  Meanwhile the only</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment"> * way to know which channel is being opened, other than a set ordering (certainly inconvenient at best in many</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span><span class="comment"> * cases), is to perhaps exchange some information on the channels themselves.  That too is inconvenient:</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment"> * even having discovered that a certain channel is for a certain purpose, distributing them around the app is</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment"> * no fun probably.  Furthermore, it&#39;s only a `Channel`: is the user supposed to encode something in a binary</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment"> * blob?  Inconvenient.  But if one turns it into a `struc::Channel`, then that is irreversible and may not</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment"> * be what the user wants.  The solution we use: the open_channel() call is issued with a separate (to any</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment"> * structured in-message the user would see) chunk of capnp-structured *metadata*.  This is transmitted</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span><span class="comment"> * and supplied to the on-passive-open handler per the preceding doc section.  Details:</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span><span class="comment"> *</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span><span class="comment"> * It is encoded in a capnp-`struct` `Metadata`, defined in common.capnp.  However that `struct`</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span><span class="comment"> * is generically parameterized on another capnp-type of the user&#39;s choice.  That is the Session template arg</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span><span class="comment"> * #Mdt_payload_obj.  Hence the user shall decide how to encode the channel-differentiating info on a</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span><span class="comment"> * per-Session basis.  capnp shall generate the usual `Reader` and `Builder` nested classes; the latter to</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span><span class="comment"> * build it to pass into open_channel(); the former to read it, the on-passive-open handler having fired.</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span><span class="comment"> * Call capnp-generated `Builder` setters and `Reader` getters accordingly on either side.</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span><span class="comment"> *</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span><span class="comment"> * This feature is optional to use.  You may set #Mdt_payload_obj to `capnp::Void`; omit</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span><span class="comment"> * the metadata argument to open_channel(); and ignore the `Reader` counterpart in the on-passive-open handler.</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span><span class="comment"> *</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span><span class="comment"> * Informal suggestion: While Session concept does not specify anything about clients or servers, as of this</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span><span class="comment"> * writing the client-server model is the only one available, hence #Client_session and #Server_session are the impls</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span><span class="comment"> * used.  `Server_session`s are produced, in this model, via Session_server.  The latter class template</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span><span class="comment"> * requires that `Mdt_payload` be specified as a template arg to be applied to all Server_session</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span><span class="comment"> * objects it produces.  Therefore it must be decided not just for each session but realistically for the entire</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span><span class="comment"> * client/server split (in other words the entire meta-application that was split into two): all the</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span><span class="comment"> * `Server_session`s; and therefore to all the `Client_session`s as well (since the 2 are peers to each other).</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="comment"> * So the method of signaling channel type (if needed) via metadata is quite a high-level decision.</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment"> * One obvious idea is to maintain a split-wide capnp schema that specifies the `struct` to use as</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span><span class="comment"> * `Mdt_payload`; in that `struct` define perhaps a capnp-`enum` type for channel type.</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span><span class="comment"> * Alternatively one can define a top-level anon capnp-`union`; its `which()` selector can function as an</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span><span class="comment"> * enumeration (in fact it is one in the generated C++); and any further data (e.g., the processor core index,</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span><span class="comment"> * if there&#39;s some channel-per-core setup) inside that particular `which()`&#39;s `struct`.  Do be careful to</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span><span class="comment"> * (1) maintain backward and forward compatibility as channel types are added over time; and (2)</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span><span class="comment"> * do not abuse the metadata store with large structures.  Anything that is not directly used in differentiating</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span><span class="comment"> * between channels should simply be communicated over the channel itself, once it has been routed to the</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span><span class="comment"> * proper area of code; that&#39;s what transport::struc::Channel is for in particular.</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment"> *</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment"> * ### Error handling semantics ###</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment"> * There are 2 sources of errors: background (async) errors and synchronously from invoking active-open: open_channel().</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span><span class="comment"> * A given error is either *session-hosing* (fatal) or not.  To make handling error simpler these are the semantics:</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span><span class="comment"> *   - open_channel() synchronously emitted errors: *not* session-hosing.</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span><span class="comment"> *   - Background (async) errors: *always* session-hosing.</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span><span class="comment"> *</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span><span class="comment"> * Even if, internally, open_channel() in some way triggers a session-hosing error, it shall be emitted</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span><span class="comment"> * as-if it were an async error in a way indistinguishable in practice from any other async error.</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span><span class="comment"> *</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span><span class="comment"> * When a session-hosing error occurs, it is emitted exactly once (through the on-error handler).  After such an</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span><span class="comment"> * event, open_channel() and other APIs shall no-op/return sentinel subsequently if invoked.</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span><span class="comment"> *</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span><span class="comment"> * This is simpler than how transport::struc::Channel emits errors; there the (always synchronous) `send()`</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span><span class="comment"> * can emit an error synchronously that is session-hosing; in addition to incoming-direction session-hosing errors;</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span><span class="comment"> * but still only one of these can occur and only once.  So in that sense open_channel() is *not* like `send()`:</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span><span class="comment"> * if it emits an error, `*this` is still formally in non-session-hosed state.</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span><span class="comment"> *</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span><span class="comment"> * However, of course, the user is free to treat an open_channel()-emitted error as fatal and destroy `*this`.</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span><span class="comment"> *</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span><span class="comment"> * @see Channel and buddies: the main object of opening a Session is to be able to easily active-open and/or</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span><span class="comment"> *      passive-open `Channel`s in PEER state through it.</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span><span class="comment"> * @see #Client_session, #Server_session: as of this writing, any non-SHM-enabled pair of PEER-state `Session`s is</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span><span class="comment"> *      a #Client_session and a #Server_session.  `Server_session`s in a process, designated as the *server* in an</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span><span class="comment"> *      IPC *split*, are obtained (following the acceptor pattern) via a single Session_server in that</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span><span class="comment"> *      process.  On the other side, a Client_session is directly constructed (in NULL state) and</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span><span class="comment"> *      enters PEER state via Client_session::sync_connect().  (Conceptually this is similar to the relationship</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span><span class="comment"> *      between, e.g., Native_socket_stream (server side), Native_socket_stream_acceptor, and Native_socket_stream</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span><span class="comment"> *      (client side).  However, it so happens that in the case of `Session`s, a different class is used depending</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span><span class="comment"> *      on which side the Session sits.  Since they both implement the same concept, however, code can be written</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span><span class="comment"> *      that behaves identically -- given any Session in PEER state -- regardless of whether it&#39;s really a</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span><span class="comment"> *      Client_session or Server_session.  That said, such code does have to be templated on the particular</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span><span class="comment"> *      Session as a template param.)</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span><span class="comment"> * @see E.g., shm::classic::Client_session and shm::classic::Server_session which are an example of a SHM-enabled</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span><span class="comment"> *      variant of Session impls.</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span><span class="comment"> *</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span><span class="comment"> * @tparam Mdt_payload</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span><span class="comment"> *         capnp-generated class for the user&#39;s capnp-`struct` of choice for open_channel() transmitting metadata</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span><span class="comment"> *         information to be received on the other side&#39;s on-passive-open handler.  See discussion above.</span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span><span class="comment"> *         Use `capnp::Void` if not planning to use this metadata feature.</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span><span class="comment"> */</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Mdt_payload = ::capnp::Vo<span class="keywordtype">id</span>&gt;</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html">  215</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1session_1_1Session.html">Session</a></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>{</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span><span class="comment"></span> </div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span><span class="comment">   * Each successful open_channel() and on-passive-open handler firing shall yield a concrete transport::Channel</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span><span class="comment">   * instance of this type -- in PEER state.  The concept does not specify how the concrete Channel instance type --</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span><span class="comment">   * meaning the template params to `Channel` -- is determined.  In practice it is likely to be controlled by</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span><span class="comment">   * unspecified compile-time knobs, likely additional template params, to the particular Session impl.</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span><span class="comment">   * E.g., see Client_session:S_MQS_ENABLED.</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span><span class="comment">   *</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span><span class="comment">   * In practice a user is likely to declare `Channel` variables by using this alias (or via `auto`).</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span><span class="comment">   *</span></div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span><span class="comment">   * @note #Channel_obj shall be such that its compile-time transport::Channel::S_IS_SYNC_IO_OBJ is `true`.</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span><span class="comment">   *       E.g., if it&#39;s got a native-socket-stream, it&#39;ll be transport::sync_io::Native_socket_stream -- not</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span><span class="comment">   *       transport::Native_socket_stream.  If you want one with transport::Channel::S_IS_ASYNC_IO_OBJ then</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span><span class="comment">   *       use transport::Channel::async_io_obj() (or to just get the type at compile time:</span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span><span class="comment">   *       transport::Channel::Async_io_obj).</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span><span class="comment">   */</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a2f770785552536f3b929f293c44834d2">  235</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#a2f770785552536f3b929f293c44834d2">Channel_obj</a> = unspecified;</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span><span class="comment"></span> </div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span><span class="comment">  /// Short-hand for `Mdt_payload` template arg.</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#af572e522f2e85258bdfd091fd6e9a58b">  238</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#af572e522f2e85258bdfd091fd6e9a58b">Mdt_payload_obj</a> = Mdt_payload;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span><span class="comment"></span> </div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span><span class="comment">  /// Pointee of #Mdt_builder_ptr.</span></div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#ac3f52804db8ecf1d0dc0d0bbdf97e062">  241</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#ac3f52804db8ecf1d0dc0d0bbdf97e062">Mdt_builder</a></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>    = <span class="keyword">typename</span> <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#abfde278018c84aa1542475e9a4089c29">transport::struc::schema::Metadata&lt;Mdt_payload_obj&gt;::Builder</a>;</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span><span class="comment"></span> </div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span><span class="comment">   * Ref-counted handle to a capnp-generated `Builder` (and the payload it accesses) through which the user</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span><span class="comment">   * shall mutate the open_channel() metadata before invoking open_channel().  mdt_builder() returns</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span><span class="comment">   * a new one; then user mutates it; then user calls open_channel().  To mutate an `x` of this type:</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span><span class="comment">   * `auto root = x-&gt;initPayload();`, then mutate via the `root` sub-builder (standard capnp-generated API for whatever</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span><span class="comment">   * fields capnp-`struct` #Mdt_payload_obj defines).</span></div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="comment">   */</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a2ee877327fded2c2b1978453831c2b1b">  251</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#a2ee877327fded2c2b1978453831c2b1b">Mdt_builder_ptr</a></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span>    = shared_ptr&lt;Mdt_builder&gt;;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span><span class="comment"></span> </div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span><span class="comment">   * Ref-counted handle to a capnp-generated `Reader` (and the payload it accesses) through which the user</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span><span class="comment">   * shall access the metadata the other side prepared via #Mdt_builder_ptr.  On-passive-open handler</span></div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span><span class="comment">   * yields a handle of this type.  To access via an `x` of this type:</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span><span class="comment">   * `auto root = x-&gt;getPayload();`, then access via the `root` sub-reader (standard capnp-generated API for whatever</span></div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span><span class="comment">   * fields capnp-`struct` #Mdt_payload_obj defines).</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span><span class="comment">   */</span></div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#ae197d051e06be6f132e193e9ba7ab6ae">  261</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#ae197d051e06be6f132e193e9ba7ab6ae">Mdt_reader_ptr</a></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span>    = <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#af94f8698ca62a84d6366aaa931375d41">shared_ptr&lt;typename transport::struc::schema::Metadata&lt;Mdt_payload_obj&gt;::Reader</a>&gt;;</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span><span class="comment"></span> </div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span><span class="comment">   * Convenience alias for the transport::struc::Channel concrete type to use if one desires (1) to upgrade a</span></div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span><span class="comment">   * `*this`-generated channel to a `struc::Channel` and (2) to efficiently use the built-in</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span><span class="comment">   * capabilities of `*this` (notably, if applicable: SHM) for zero-copy performance when sending messages through</span></div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span><span class="comment">   * that channel.</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span><span class="comment">   *</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span><span class="comment">   * @note This alias is to an async-I/O `struc::Channel`.  (See util::sync_io doc header for background on</span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span><span class="comment">   *       the 2 patterns, async-I/O and `sync_io`.)  To obtain the `sync_io`-core counterpart type use:</span></div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span><span class="comment">   *       `Session::Structured_channel::Sync_io_obj`.</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span><span class="comment">   *</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment">   * ### Informal suggestion ###</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span><span class="comment">   * Use this (parameterized by `Message_body` of choice of course) as your transport::struc::Channel</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span><span class="comment">   * concrete type.  Then use the appropriate tag-form `struc::Channel` ctor.  Namely as of this writing:</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span><span class="comment">   *   - `*_shm_*_session`: Use tag</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span><span class="comment">   *     transport::struc::Channel_base::S_SERIALIZE_VIA_APP_SHM or</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span><span class="comment">   *     transport::struc::Channel_base::S_SERIALIZE_VIA_SESSION_SHM</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span><span class="comment">   *   - Non-shm `*_session`: Use tag</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span><span class="comment">   *     transport::struc::Channel_base::S_SERIALIZE_VIA_HEAP.</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span><span class="comment">   *</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span><span class="comment">   * @tparam Message_body</span></div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span><span class="comment">   *         See transport::struc::Channel.  All the other annoying decisions are made for you using this alias;</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span><span class="comment">   *         but of course you must still specify the language you shall be speaking over the channel.</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span><span class="comment">   */</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Message_body&gt;</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a29eaaa691a992e3a83662e00be7d7446">  288</a></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Channel.html">Structured_channel</a></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span>    = <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Channel.html">transport::struc::Channel&lt;unspecified&gt;</a>;</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span><span class="comment"></span> </div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span><span class="comment">   * Convenience alias equal to `Structured_channel&lt;M&gt;::Builder_config` (regardless of `M`).</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span><span class="comment">   * See #Structured_channel.</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span><span class="comment">   *</span></div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span><span class="comment">   * Informally: The impl template may choose to provide methods to obtain a #Structured_msg_builder_config</span></div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span><span class="comment">   * to use for a `Structured_channel::Msg_out` that can be constructed without a concrete #Structured_channel</span></div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span><span class="comment">   * available.  These methods might in some cases even be `static` (in which case they should</span></div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span><span class="comment">   * take a `Logger* logger_ptr` 1st arg), so that not even having a `Session` object in hand is needed.</span></div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span><span class="comment">   */</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a2612cefeace1ba12e649ba0e509aaab1">  300</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#a2612cefeace1ba12e649ba0e509aaab1">Structured_msg_builder_config</a> = unspecified;</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span><span class="comment"></span> </div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span><span class="comment">   * Convenience alias equal to `Structured_channel&lt;M&gt;::Reader_config` (regardless of `M`).</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span><span class="comment">   * See #Structured_channel.  The utility of explicit use of this alias by the user is less than</span></div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span><span class="comment">   * #Structured_msg_builder_config, as a transport::struc::Msg_in is not constructed directly</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span><span class="comment">   * but by transport::struc::Channel internals.</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span><span class="comment">   */</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#ac23d047087984addf221f0baa0058616">  308</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#ac23d047087984addf221f0baa0058616">Structured_msg_reader_config</a> = unspecified;</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span> </div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span>  <span class="comment">// Constants.</span></div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span><span class="comment"></span> </div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span><span class="comment">   * Specifies the SHM-provider for which this `Session` concept implementation provides support; or `NONE`</span></div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span><span class="comment">   * if this is a vanilla `Session` that does not provide SHM-based zero-copy support.  May be useful for</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span><span class="comment">   * generic programming; perhaps in `std::conditional` or `if constexpr()` uses.  Informally we recommend against</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span><span class="comment">   * frequent use of this except logging/reporting/alerting and debug/test scenarios.</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span><span class="comment">   *</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span><span class="comment">   * @see #S_SHM_ENABLED.</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span><span class="comment">   */</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a62a1a415a92bf6e0b4d83987394ae78b">  320</a></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> schema::ShmType <a class="code hl_variable" href="classipc_1_1session_1_1Session.html#a62a1a415a92bf6e0b4d83987394ae78b">S_SHM_TYPE</a> = unspecified;</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span><span class="comment"></span> </div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span><span class="comment">   * Specifies whether this `Session` concept implementation provides support for zero-copy via SHM plus</span></div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span><span class="comment">   * direct access to SHM arenas and lending/borrowing within them.  May be useful for</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span><span class="comment">   * generic programming; perhaps in `std::conditional` or `if constexpr()` uses.</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span><span class="comment">   *</span></div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span><span class="comment">   * @see #S_SHM_TYPE</span></div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span><span class="comment">   */</span></div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a7f28ff5d2fc6e9830877979fafe48cf7">  329</a></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1session_1_1Session.html#a7f28ff5d2fc6e9830877979fafe48cf7">S_SHM_ENABLED</a> = unspecified;</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span> </div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span><span class="comment"></span> </div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span><span class="comment">   * Default ctor: creates Session in NULL state (not operational).</span></div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span><span class="comment">   * Beyond this and the move ctor, other ctors are unspecified by the concept but may well exist.  See discussion in</span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span><span class="comment">   * concept doc header.</span></div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span><span class="comment">   *</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span><span class="comment">   * The practical intended use for this ctor is as a target for a subsequent move-to assignment.  For example,</span></div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span><span class="comment">   * Session_server::async_accept() would typically be given a default-cted Server_session which, on success,</span></div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span><span class="comment">   * is moved-to to enter PEER state.</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span><span class="comment">   */</span></div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a08416c5a34aa4eb58db094e946b540e3">  342</a></span>  <a class="code hl_function" href="classipc_1_1session_1_1Session.html#a08416c5a34aa4eb58db094e946b540e3">Session</a>();</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span><span class="comment"></span> </div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span><span class="comment">   * Move ctor: `*this` becomes identical to `src`; while `src` becomes as-if default-cted.</span></div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span><span class="comment">   *</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span><span class="comment">   * @param src</span></div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span><span class="comment">   *        Moved-from session that enters NULL state.</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span><span class="comment">   */</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a230afdc0889f869e3b0606a826115745">  350</a></span>  <a class="code hl_function" href="classipc_1_1session_1_1Session.html#a230afdc0889f869e3b0606a826115745">Session</a>(<a class="code hl_class" href="classipc_1_1session_1_1Session.html">Session</a>&amp;&amp; src);</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span><span class="comment"></span> </div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span><span class="comment">  /// Copy construction is disallowed.</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a611bf472626baa35d3e6cd661735d953">  353</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1session_1_1Session.html#a611bf472626baa35d3e6cd661735d953">Session</a>(<span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1session_1_1Session.html">Session</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span><span class="comment"></span> </div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span><span class="comment">   * In NULL state, no-op; in PEER state: Ends the session while informing (if possible) the opposing peer Session that</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span><span class="comment">   * the present session has ended.  This may incur a short delay before the dtor exits (in practice likely to</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span><span class="comment">   * flush out any pending sends over an internal session master channel, informally speaking).</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span><span class="comment">   *</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span><span class="comment">   * Any #Channel_obj previously yielded by open_channel() and/or passive-opens shall continue operating, if still</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span><span class="comment">   * operating, and it is up to the user to perform any cleanup/flushing/etc. on these.  This is consistent with</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span><span class="comment">   * the idea that open_channel() and passive-open passes ownership of such channels to the user.</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span><span class="comment">   *</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span><span class="comment">   * There are 2 mutually exclusive expected triggers for why this dtor would be invoked:</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span><span class="comment">   *   - The present process is exiting gracefully (hence the session must end).  User invokes dtor.  Dtor informs</span></div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span><span class="comment">   *     the other side with maximum expediency; then returns.</span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span><span class="comment">   *   - The opposing process is exiting gracefully or otherwise; the opposing Session thus informed ours gracefully</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span><span class="comment">   *     or otherwise; therefore `*this` informs user of this via emitted error (see concept doc header regarding</span></div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span><span class="comment">   *     session-hosing error emission semantics); therefore `*this` is no longer usable; hence user invokes</span></div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span><span class="comment">   *     `*this` dtor.  It tries to inform the other side, but there&#39;s nothing to inform; it quickly returns.</span></div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span><span class="comment">   */</span></div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a8cb20f446c2a4327a3a8143af137dbca">  372</a></span>  <a class="code hl_function" href="classipc_1_1session_1_1Session.html#a8cb20f446c2a4327a3a8143af137dbca">~Session</a>();</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span> </div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span><span class="comment"></span> </div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span><span class="comment">   * Move assignment: acts as-if `*this` dtor executed; then `*this` becomes identical to `src`; while `src` becomes</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span><span class="comment">   * as-if default-cted.  No-op if `&amp;src == this`.</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span><span class="comment">   *</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span><span class="comment">   * @param src</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span><span class="comment">   *        Moved-from session that enters NULL state (unless `&amp;src == this`).</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span><span class="comment">   * @return `*this`.</span></div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span><span class="comment">   */</span></div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#aa3e921f8f06a051423c60ba2f2736dde">  384</a></span>  <a class="code hl_class" href="classipc_1_1session_1_1Session.html">Session</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session.html#aa3e921f8f06a051423c60ba2f2736dde">operator=</a>(<a class="code hl_class" href="classipc_1_1session_1_1Session.html">Session</a>&amp;&amp; src);</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span><span class="comment"></span> </div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span><span class="comment">  /// Copy assignment is disallowed.</span></div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#aee51c401ffff7cc66787c566d734f8e3">  387</a></span><span class="comment"></span>  <a class="code hl_class" href="classipc_1_1session_1_1Session.html">Session</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session.html#aee51c401ffff7cc66787c566d734f8e3">operator=</a>(<span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1session_1_1Session.html">Session</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span><span class="comment"></span> </div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span><span class="comment">   * Returns a new metadata holder to be subsequently mutated by the user and then passed to open_channel() to</span></div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span><span class="comment">   * initiate active-open attempt.  The payload (see #Mdt_payload_obj) is left uninitialized:</span></div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span><span class="comment">   * the user would likely `x-&gt;initPayload()` and then mutate stuff inside that (where `x` was returned).</span></div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span><span class="comment">   *</span></div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span><span class="comment">   * If `*this` is not in PEER state, returns null.</span></div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span><span class="comment">   *</span></div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span><span class="comment">   * This call is not needed, if one plans to use open_channel() overload that takes no metadata.</span></div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span><span class="comment">   *</span></div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span><span class="comment">   */</span></div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#a420df732069ded1feef423adf7a30915">  400</a></span>  <a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#a2ee877327fded2c2b1978453831c2b1b">Mdt_builder_ptr</a> <a class="code hl_function" href="classipc_1_1session_1_1Session.html#a420df732069ded1feef423adf7a30915">mdt_builder</a>();</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span><span class="comment"></span> </div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span><span class="comment">   * Synchronously active-opens a new channel which, on success, is moved-to `*target_channel`.</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span><span class="comment">   * No-op and return `false` if `*this` is not in PEER state, the session is hosed by a previous error,</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span><span class="comment">   * or `mdt` is null.  Else returns `true`.</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span><span class="comment">   *</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span><span class="comment">   * `mdt` shall be from an mdt_builder() call, and `mdt` must not have been passed to</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span><span class="comment">   * open_channel() previously; otherwise behavior undefined.  See also the open_channel() overload that takes no `mdt`.</span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span><span class="comment">   *</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span><span class="comment">   * @note This is a compile-time fact, but we point it out just the same: `*target_channel` is of</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span><span class="comment">   *       a `sync_io`-core-bearing type.  However, on successful open_channel() you can trivially obtain</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span><span class="comment">   *       an async-I/O version via `target_channel-&gt;async_io_obj()`.</span></div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span><span class="comment">   *</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span><span class="comment">   * ### Is it blocking or non-blocking? ###</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a07c2d7a228f070e32bf4f1fbc64e1f6d">  415</a></span><span class="comment">   * That&#39;s a matter of perspective; but formally it must be either non-blocking or, if blocking, then limited to</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span><span class="comment">   * a timeout no greater than seconds (not minutes).  That said, informally, the implementation shall strive to make</span></div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span><span class="comment">   * this quite fast, enough so to be considered non-blocking, *as long as both Session objects are in PEER state*.</span></div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span><span class="comment">   *</span></div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span><span class="comment">   * ### Error emission ###</span></div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span><span class="comment">   * If `false` is returned, even if open_channel() internally triggered a session-hosing condition, it shall be</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span><span class="comment">   * fired through the on-error handler and not emitted by open_channel().</span></div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span><span class="comment">   *</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span><span class="comment">   * If `true` is returned an error may be detected and is then emitted via standard Flow semantics</span></div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span><span class="comment">   * (if `err_code` then set `*err_code` to error; otherwise throw).  Such an error is *not* session-hosing.</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span><span class="comment">   *</span></div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span><span class="comment">   * In particular if passive-opens are disabled on the opposing side it must emit</span></div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span><span class="comment">   * error::Code::S_SESSION_OPEN_CHANNEL_REMOTE_PEER_REJECTED_PASSIVE_OPEN.  Informally: an impl is likely to</span></div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span><span class="comment">   * be capable of emitting the non-fatal error::Code::S_SESSION_OPEN_CHANNEL_ACTIVE_TIMEOUT, though the user</span></div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span><span class="comment">   * is reasonably likely to want to treat it as fatal in practice and end the session.</span></div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span><span class="comment">   *</span></div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span><span class="comment">   * @param target_channel</span></div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span><span class="comment">   *        On success `*target_channel` is moved-to from a (new) #Channel_obj in PEER state.</span></div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span><span class="comment">   * @param mdt</span></div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span><span class="comment">   *        See mdt_builder().  If `mdt` is null, open_channel() returns `false`.</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span><span class="comment">   *        See `flow::Error_code` docs for error reporting semantics.  #Error_code generated:</span></div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span><span class="comment">   *        error::Code::S_SESSION_OPEN_CHANNEL_REMOTE_PEER_REJECTED_PASSIVE_OPEN,</span></div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span><span class="comment">   *        other possible unspecified errors according to impl&#39;s discretion.  See above discussion.</span></div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span><span class="comment">   */</span></div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#aab01aefa0243abf84c7cc36d3ab2d852">  441</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1session_1_1Session.html#aab01aefa0243abf84c7cc36d3ab2d852">open_channel</a>(<a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#a2f770785552536f3b929f293c44834d2">Channel_obj</a>* target_channel, <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#a2ee877327fded2c2b1978453831c2b1b">Mdt_builder_ptr</a>&amp; mdt, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0);</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span><span class="comment"></span> </div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span><span class="comment">   * Identical to `open_channel(target_channel, mdt_builder(), err_code)`; in other words</span></div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span><span class="comment">   * attempts to open channel with an uninitialized channel-open metadata payload.  Informally: this overload</span></div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span><span class="comment">   * can be used if differentiation among channels, for the passive-open side&#39;s benefit, is not necessary.</span></div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span><span class="comment">   * In that case #Mdt_payload_obj is typically set to `capnp::Void`.</span></div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span><span class="comment">   *</span></div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span><span class="comment">   * @note This is a compile-time fact, but we point it out just the same: `*target_channel` is of</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span><span class="comment">   *       a `sync_io`-core-bearing type.  However, on successful open_channel() you can trivially obtain</span></div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span><span class="comment">   *       an async-I/O version via `target_channel-&gt;async_io_obj()`.</span></div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span><span class="comment">   *</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span><span class="comment">   * @param target_channel</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span><span class="comment">   *        See other open_channel().</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span><span class="comment">   *        See other open_channel().</span></div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span><span class="comment">   * @return See other open_channel().  However it cannot return `false` due to an empty `mdt`, as `mdt`</span></div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span><span class="comment">   *         is internally generated (and left uninitialized).</span></div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span><span class="comment">   */</span></div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#afd8c8f5e2c71c2c4c58f77f134aa076c">  460</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1session_1_1Session.html#afd8c8f5e2c71c2c4c58f77f134aa076c">open_channel</a>(<a class="code hl_typedef" href="classipc_1_1session_1_1Session.html#a2f770785552536f3b929f293c44834d2">Channel_obj</a>* target_channel, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0);</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span><span class="comment"></span> </div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span><span class="comment">   * In PEER state: Returns the (non-nil) logged-in session token to be used for any `struc::Channel`s</span></div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span><span class="comment">   * one may wish to upgrade from #Channel_obj channels yielded by open_channel() or passive-opens;</span></div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span><span class="comment">   * or nil if in NULL state, or if `*this` session is hosed from a prior error.</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span><span class="comment">   *</span></div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span><span class="comment">   * Informal context: Firstly see transport::struc::Channel::session_token() and class template doc header.</span></div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span><span class="comment">   * However note that open_channel() (active-open) and on-passive-open handler yields an unstructured, unused</span></div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span><span class="comment">   * #Channel_obj: it is entirely optional that the user then upgrade it to a `struc::Channel`.  *If* one</span></div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span><span class="comment">   * does so, however, then a non-nil session-token shall be *required* and, for safety, must equal</span></div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span><span class="comment">   * what this session_token() returns.</span></div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span><span class="comment">   *</span></div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span><span class="comment">   * @return See above.  The reference returned shall always be one of 2: a certain unspecified internal</span></div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span><span class="comment">   *         item, or to transport::struc::NULL_SESSION_TOKEN.</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span><span class="comment">   */</span></div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session.html#abc6ce8839621c1e19db80ccd4f2e2589">  476</a></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1session.html#ade2b302f1a3623e8adc9694568d94d2c">Session_token</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session.html#abc6ce8839621c1e19db80ccd4f2e2589">session_token</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span>}; <span class="comment">// class Session</span></div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span> </div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span><span class="preprocessor">#endif </span><span class="comment">// IPC_DOXYGEN_ONLY</span></div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span><span class="comment"></span> </div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span><span class="comment">/**</span></div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span><span class="comment"> * Implements the Session concept when it is in PEER state.  It is, as of this writing, not to be instantiated</span></div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span><span class="comment"> * by itself.  Rather see Client_session_mv and Server_session_mv regarding what to actually instantiate and</span></div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span><span class="comment"> * further context.  As for the API in Session_mv itself, it is quite critical -- but it only implements</span></div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span><span class="comment"> * Session concept, and therefore the doc headers for Session_mv members generally just send you to</span></div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span><span class="comment"> * Session doc headers.  However the Session_mv doc headers are useful in enumerating specific #Error_code</span></div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span><span class="comment"> * values that may be emitted.</span></div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span><span class="comment"> *</span></div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span><span class="comment"> * @internal</span></div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span><span class="comment"> * ### Implementation ###</span></div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span><span class="comment"> * See pImpl-lite notes in Blob_stream_mq_sender doc header.  The exact same applies here.</span></div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span><span class="comment"> *</span></div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span><span class="comment"> * Furthermore, sub-classes -- Client_session_mv, Server_session_mv -- continue the pImpl-lite pattern</span></div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span><span class="comment"> * for their added public APIs on top of the ones from this super-class.  For this reason impl() is `protected`.</span></div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span><span class="comment"> * E.g., Client_session_mv doc header explains this hierarchy.  In particular it explains what</span></div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span><span class="comment"> * `Session_impl_t` is to be set to properly.</span></div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span><span class="comment"> *</span></div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span><span class="comment"> * @endinternal</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span><span class="comment"> *</span></div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span><span class="comment"> * @tparam This is an implementation detail.  See Client_session_mv and Server_session_mv doc headers for</span></div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span><span class="comment"> *         how to easily set this to the proper type in a given situation.</span></div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span><span class="comment"> */</span></div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Session_impl_t&gt;</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html">  504</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a></div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span>{</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span><span class="keyword">protected</span>:</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span><span class="comment"></span> </div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span><span class="comment">  /// Short-hand for pImpl-lite impl type.  This shall be the deepest impl sub-class desired.</span></div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#af2c186e7b4be09bff30b42aa2482dd93">  510</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classSession__impl__t.html">Impl</a> = <a class="code hl_class" href="classSession__impl__t.html">Session_impl_t</a>;</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span> </div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span><span class="comment"></span> </div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span><span class="comment">   * @see Session::Channel_obj: implemented concept.</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span><span class="comment">   */</span></div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ab92df09d894e6e1aaf3c2733da594fd2">  519</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#ab92df09d894e6e1aaf3c2733da594fd2">Channel_obj</a> = <span class="keyword">typename</span> Impl::Channel_obj;</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span><span class="comment"></span> </div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span><span class="comment">  /// Container (`vector&lt;&gt;`) of #Channel_obj.</span></div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#af87da439644b2afd73d6a13d97e7985f">  522</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#af87da439644b2afd73d6a13d97e7985f">Channels</a> = <span class="keyword">typename</span> Impl::Channels;</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span><span class="comment"></span> </div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span><span class="comment">   * @see Session::Mdt_payload_obj: implemented concept.</span></div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span><span class="comment">   */</span></div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#acccbc643f29f002075e66cd134da70bd">  528</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#acccbc643f29f002075e66cd134da70bd">Mdt_payload_obj</a> = <span class="keyword">typename</span> Impl::Mdt_payload_obj;</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span><span class="comment"></span> </div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span><span class="comment">   * @see Session::Mdt_builder: implemented concept.</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span><span class="comment">   */</span></div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#af10f452e602e4ea7389c6a77dd9a0f88">  534</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#af10f452e602e4ea7389c6a77dd9a0f88">Mdt_builder</a> = <span class="keyword">typename</span> Impl::Mdt_builder;</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span><span class="comment"></span> </div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span><span class="comment">   * @see Session::Mdt_builder_ptr: implemented concept.</span></div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span><span class="comment">   */</span></div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a787253f02859ea6b99ce3eba92766431">  540</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a787253f02859ea6b99ce3eba92766431">Mdt_builder_ptr</a> = <span class="keyword">typename</span> Impl::Mdt_builder_ptr;</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span><span class="comment"></span> </div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span><span class="comment">   * @see Session::Mdt_reader_ptr: implemented concept.</span></div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span><span class="comment">   */</span></div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a2b1215fb0c9738b9fcfbb337d23c43df">  546</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a2b1215fb0c9738b9fcfbb337d23c43df">Mdt_reader_ptr</a> = <span class="keyword">typename</span> Impl::Mdt_reader_ptr;</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span><span class="comment"></span> </div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span><span class="comment">   *</span></div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span><span class="comment">   * @note In particular Client_session_mv and Server_session_mv inherit this, and thus they show up there and thus</span></div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span><span class="comment">   *       in #Client_session and #Server_session.  However if you&#39;re using a SHM-enabled</span></div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span><span class="comment">   *       variant (e.g., shm::classic::Client_session, shm::classic::Server_session), then</span></div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span><span class="comment">   *       this alias will be shadowed by a better definition that will make use of SHM for zero-copy transmission</span></div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span><span class="comment">   *       of structured messages.  This super-class definition then becomes, in a sense, obsolete:</span></div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span><span class="comment">   *       It can be used, if you still want to use non-zero-copy heap-based serialization; but it is usually</span></div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span><span class="comment">   *       better to use, directly, the shadowing definition: e.g., shm::classic::Session_mv::Structured_channel</span></div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span><span class="comment">   *       (which will show up in shm::classic::Server_session and shm::classic::Client_session).</span></div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span><span class="comment">   *</span></div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span><span class="comment">   * @see Session::Structured_channel: implemented concept.</span></div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span><span class="comment">   */</span></div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Message_body&gt;</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ac205819d4a3a066f31b5af311ff40a2a">  563</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#ac205819d4a3a066f31b5af311ff40a2a">Structured_channel</a></div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span>    = <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Channel.html">transport::struc::Channel_via_heap&lt;Channel_obj, Message_body&gt;</a>;</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span><span class="comment"></span> </div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span><span class="comment">   *</span></div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span><span class="comment">   * @note Same note as in #Structured_channel doc header.</span></div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span><span class="comment">   *</span></div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span><span class="comment">   * @see Session::Structured_msg_builder_config: implemented concept.</span></div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span><span class="comment">   */</span></div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a9f6e9a57f6e6ab420d554a2c0eba7877">  573</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a9f6e9a57f6e6ab420d554a2c0eba7877">Structured_msg_builder_config</a> = <span class="keyword">typename</span> Impl::Structured_msg_builder_config;</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span><span class="comment"></span> </div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span><span class="comment">   *</span></div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span><span class="comment">   * @note Same note as in #Structured_channel doc header.</span></div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span><span class="comment">   *</span></div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span><span class="comment">   * @see Session::Structured_msg_reader_config: implemented concept.</span></div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span><span class="comment">   */</span></div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a335c3585402cc9430f8c909e8c7e55f4">  582</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a335c3585402cc9430f8c909e8c7e55f4">Structured_msg_reader_config</a> = <span class="keyword">typename</span> Impl::Structured_msg_builder_config;</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno">  583</span> </div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span>  <span class="comment">// Constants.</span></div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span><span class="comment"></span> </div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span><span class="comment">   * @see Session::S_SHM_TYPE: implemented concept.</span></div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span><span class="comment">   */</span></div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a74af091662cb7c32e0f1c60baac3613b">  590</a></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> schema::ShmType <a class="code hl_variable" href="classipc_1_1session_1_1Session__mv.html#a74af091662cb7c32e0f1c60baac3613b">S_SHM_TYPE</a> = Impl::S_SHM_TYPE;</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span><span class="comment"></span> </div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span><span class="comment">   * @see Session::S_SHM_ENABLED: implemented concept.</span></div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span><span class="comment">   */</span></div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a62945e465ae734523036215750c90ba4">  596</a></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1session_1_1Session__mv.html#a62945e465ae734523036215750c90ba4">S_SHM_ENABLED</a> = Impl::S_SHM_ENABLED;</div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span><span class="comment"></span> </div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span><span class="comment">  /// Compile-time-known constant indicating whether #Channel_obj shall use a blobs pipe over message queues (MQs).</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a6a87002dccab497da76bb286d5a4bf95">  599</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1session_1_1Session__mv.html#a6a87002dccab497da76bb286d5a4bf95">S_MQS_ENABLED</a> = Impl::S_MQS_ENABLED;</div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span><span class="comment"></span> </div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span><span class="comment">   * Compile-time-known constant indicating whether #Channel_obj shall use socket stream for any type of pipe.</span></div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span><span class="comment">   * If #S_MQS_ENABLED, then a socket stream is still needed if and only if user wants to transmit native handles.</span></div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span><span class="comment">   * If #S_MQS_ENABLED is `false`, then a socket stream is the only transport available as of this writing and hence</span></div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span><span class="comment">   * also enabled.</span></div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span><span class="comment">   */</span></div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#addc597e6bf3555dc3788116c8cc179dd">  607</a></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1session_1_1Session__mv.html#addc597e6bf3555dc3788116c8cc179dd">S_SOCKET_STREAM_ENABLED</a> = Impl::S_SOCKET_STREAM_ENABLED;</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span> </div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span><span class="comment"></span> </div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno">  611</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span><span class="comment">   * Implements Session API per contract.  Reminder: While not enforced, this ctor form is informally intended only</span></div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span><span class="comment">   * for when one will move-from a PEER-state Session_mv.  In particular Session_server::async_accept()</span></div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span><span class="comment">   * requires these move semantics; so a default-cted Session_mv would be typically passed to it by the</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span><span class="comment">   * user.</span></div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno">  616</span><span class="comment">   *</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span><span class="comment">   * @see Session::Session(): implemented concept.</span></div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span><span class="comment">   */</span></div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#af964cb260766684d46503b43d0faa777">  619</a></span>  <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#af964cb260766684d46503b43d0faa777">Session_mv</a>();</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span><span class="comment"></span> </div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno">  621</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span><span class="comment">   *</span></div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span><span class="comment">   * @param src</span></div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span><span class="comment">   *</span></div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno">  627</span><span class="comment">   * @see Session move ctor: implemented concept.</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span><span class="comment">   */</span></div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ad1cffabdbc41809399b4bda9330f5367">  629</a></span>  <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#ad1cffabdbc41809399b4bda9330f5367">Session_mv</a>(<a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a>&amp;&amp; src);</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span><span class="comment"></span> </div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span><span class="comment">  /// Copy ction is disallowed.</span></div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a1293a6369b78d12bad869ca812be0f74">  632</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a1293a6369b78d12bad869ca812be0f74">Session_mv</a>(<span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span><span class="comment"></span> </div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span><span class="comment">   * @see Session::~Session(): implemented concept.</span></div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span><span class="comment">   */</span></div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a0b4f0cdde3221b0922e0b44cbb6011a2">  638</a></span>  <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a0b4f0cdde3221b0922e0b44cbb6011a2">~Session_mv</a>();</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno">  639</span> </div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span><span class="comment"></span> </div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno">  642</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span><span class="comment">   *</span></div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno">  645</span><span class="comment">   * @param src</span></div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span><span class="comment">   *</span></div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span><span class="comment">   * @see Session move assignment: implemented concept.</span></div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span><span class="comment">   */</span></div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ac000e14183b5dcb523ff0eaaf030968c">  651</a></span>  <a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#ac000e14183b5dcb523ff0eaaf030968c">operator=</a>(<a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a>&amp;&amp; src);</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span><span class="comment"></span> </div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span><span class="comment">  /// Copy assignment is disallowed.</span></div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#aeb7d7965c0fc0736b6c59f5f81a3e8c2">  654</a></span><span class="comment"></span>  <a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#aeb7d7965c0fc0736b6c59f5f81a3e8c2">operator=</a>(<span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span><span class="comment"></span> </div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span><span class="comment">   *</span></div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno">  660</span><span class="comment">   *</span></div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span><span class="comment">   * @see Session::mdt_builder(): implemented concept.</span></div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span><span class="comment">   */</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#aba79f245e6f726ac6aa573e45e0bfdf3">  663</a></span>  <a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a787253f02859ea6b99ce3eba92766431">Mdt_builder_ptr</a> <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#aba79f245e6f726ac6aa573e45e0bfdf3">mdt_builder</a>();</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span><span class="comment"></span> </div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span><span class="comment">   * Implements Session API per contract.  Reminder: Per concept requirements, open_channel() emitting an error</span></div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span><span class="comment">   * (via standard Flow semantics) means that error is *not* session-hosing.  Any session-hosing event is orthogonally</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span><span class="comment">   * emitted to on-error handler.  Informally: in most cases even the (formally non-session-hosing) errors</span></div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span><span class="comment">   * below indicate something seriously wrong is afoot.  It would not be unreasonable to treat them as session-hosing</span></div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span><span class="comment">   * (invoke dtor).</span></div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno">  671</span><span class="comment">   *</span></div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span><span class="comment">   * @param target_channel</span></div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno">  673</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span><span class="comment">   * @param mdt</span></div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span><span class="comment">   *        See above.  #Error_code generated:</span></div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno">  678</span><span class="comment">   *        error::Code::S_SESSION_OPEN_CHANNEL_REMOTE_PEER_REJECTED_PASSIVE_OPEN (per concept),</span></div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span><span class="comment">   *        error::Code::S_SESSION_OPEN_CHANNEL_ACTIVE_TIMEOUT (peer neither accepted nor rejected in non-blocking</span></div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span><span class="comment">   *        time frame),</span></div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span><span class="comment">   *        error::Code::S_SESSION_OPEN_CHANNEL_SERVER_CANNOT_PROCEED_RESOURCE_UNAVAILABLE (opposing or local</span></div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span><span class="comment">   *        #Server_session peer was unable to acquire resources -- as of this writing MQ-related ones -- required</span></div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno">  683</span><span class="comment">   *        for opening channel).</span></div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno">  685</span><span class="comment">   *</span></div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno">  686</span><span class="comment">   * @see Session::open_channel(): implemented concept.</span></div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span><span class="comment">   */</span></div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a6d8cdbb86140056a7e7d2931ea642b18">  688</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a6d8cdbb86140056a7e7d2931ea642b18">open_channel</a>(<a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#ab92df09d894e6e1aaf3c2733da594fd2">Channel_obj</a>* target_channel, <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a787253f02859ea6b99ce3eba92766431">Mdt_builder_ptr</a>&amp; mdt, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0);</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span><span class="comment"></span> </div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span><span class="comment">   * Implements Session API per contract.  See other overload for brief discussion relevant here also.</span></div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno">  692</span><span class="comment">   *</span></div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span><span class="comment">   * @param target_channel</span></div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno">  696</span><span class="comment">   *        See above.  See also other overload.</span></div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno">  697</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span><span class="comment">   *</span></div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno">  699</span><span class="comment">   * @see Session::open_channel(): implemented concept.</span></div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span><span class="comment">   */</span></div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a84e80e24d7b16da0a9ecf83057acfd8e">  701</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a84e80e24d7b16da0a9ecf83057acfd8e">open_channel</a>(<a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#ab92df09d894e6e1aaf3c2733da594fd2">Channel_obj</a>* target_channel, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0);</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span><span class="comment"></span> </div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno">  703</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span><span class="comment">   * Implements Session API per contract.</span></div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno">  705</span><span class="comment">   *</span></div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span><span class="comment">   *</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span><span class="comment">   * @see Session::session_token(): implemented concept.</span></div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span><span class="comment">   */</span></div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a749f1f679f858d2dce8562cdddc60195">  710</a></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1session.html#ade2b302f1a3623e8adc9694568d94d2c">Session_token</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a749f1f679f858d2dce8562cdddc60195">session_token</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno">  711</span><span class="comment"></span> </div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno">  712</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span><span class="comment">   * Utility that obtains a heap-based (non-zero-copy) Struct_builder::Config, constructed with the most efficient</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span><span class="comment">   * yet safe values, for transport::struc::Msg_out (out-messages) compatible with #Structured_channel upgraded-from</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span><span class="comment">   * #Channel_obj channels opened via this Session_mv type.  Informally, typically, this is useful if and only if you&#39;d</span></div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span><span class="comment">   * like to construct a transport::struc::Msg_out, and:</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span><span class="comment">   *   - you lack a struc::Channel object from which to issue struc::Channel::create_msg() or</span></div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span><span class="comment">   *     struc::Channel::struct_builder_config(), or if you have one, but the target out-message is</span></div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span><span class="comment">   *     intended for multiple channels, so you don&#39;t want to stylistically tie the out-message&#39;s creation</span></div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span><span class="comment">   *     to any particular one channel; and</span></div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span><span class="comment">   *   - you lack a Session_mv object from which to issue non-static `this-&gt;heap_fixed_builder_config()`, or if</span></div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span><span class="comment">   *     you have one, but the target out-message intended for multiple sessions, so you don&#39;t want</span></div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno">  723</span><span class="comment">   *     to stylistically tie the out-message&#39;s creation to any particular one Session_mv.</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span><span class="comment">   *</span></div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span><span class="comment">   * Otherwise one would typically use `struc::Channel::create_msg()/struct_builder_config()` or a</span></div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span><span class="comment">   * `this-&gt;heap_fixed_builder_config()` respectively.</span></div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno">  727</span><span class="comment">   *</span></div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span><span class="comment">   * ### Usability in SHM-based Session impls ###</span></div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span><span class="comment">   * Do note this method is available, via base class, in SHM-based Session impls</span></div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span><span class="comment">   * (e.g., shm::classic::Server_session and shm::classic::Client_session) -- nothing forbids the use of</span></div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span><span class="comment">   * heap-based messaging even in such a session.  However it would typically be better for performance</span></div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span><span class="comment">   * (and in many cases is the reason for using a SHM-based Session impl in the first place) to use the</span></div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span><span class="comment">   * non-heap-based counterparts to this method.  E.g., see</span></div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno">  734</span><span class="comment">   * shm::classic::Session_mv::session_shm_builder_config() and</span></div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span><span class="comment">   * shm::classic::Session_mv::app_shm_builder_config(); possibly</span></div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span><span class="comment">   * shm::classic::Session_server::app_shm_builder_config().</span></div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span><span class="comment">   *</span></div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span><span class="comment">   *        Logger to pass to the returned `Config`.</span></div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span><span class="comment">   */</span></div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a26dfe4dd3ff57daab5a36a037f835c4e">  742</a></span>  <span class="keyword">static</span> <a class="code hl_struct" href="structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html">transport::struc::Heap_fixed_builder::Config</a> <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a26dfe4dd3ff57daab5a36a037f835c4e">heap_fixed_builder_config</a>(flow::log::Logger* logger_ptr);</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span><span class="comment"></span> </div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno">  745</span><span class="comment">   * Utility that obtains a heap-based (non-zero-copy) Struct_builder::Config, constructed with the most efficient</span></div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span><span class="comment">   * yet safe values, for transport::struc::Msg_out (out-messages) compatible with #Structured_channel upgraded-from</span></div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span><span class="comment">   * #Channel_obj channels opened via `*this` Session_mv.  It is, simply, `heap_fixed_builder_config(L)`, where</span></div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span><span class="comment">   * `L` is the Flow `Logger*` belonging to `*this` Session.</span></div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span><span class="comment">   *</span></div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span><span class="comment">   * Informally, typically, this is useful if and only if you&#39;d like to construct a transport::struc::Msg_out, and:</span></div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno">  751</span><span class="comment">   *   - you lack a struc::Channel object from which to issue struc::Channel::create_msg() or</span></div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span><span class="comment">   *     struc::Channel::struct_builder_config(), or if you have one, but the target out-message is</span></div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span><span class="comment">   *     intended for multiple channels, so you don&#39;t want to stylistically tie the out-message&#39;s creation</span></div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno">  754</span><span class="comment">   *     to any particular one channel; and</span></div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span><span class="comment">   *   - you do have a Session_mv object from which to issue non-static `this-&gt;heap_fixed_builder_config()`.</span></div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span><span class="comment">   *</span></div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span><span class="comment">   * ### Usability in SHM-based Session impls ###</span></div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span><span class="comment">   * The note in the other overload&#39;s doc header applies equally.</span></div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno">  759</span><span class="comment">   *</span></div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span><span class="comment">   */</span></div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a107684fdd5d233549c6daac26a81a542">  762</a></span>  <a class="code hl_struct" href="structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html">transport::struc::Heap_fixed_builder::Config</a> <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a107684fdd5d233549c6daac26a81a542">heap_fixed_builder_config</a>();</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span><span class="comment"></span> </div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span><span class="comment">   * Deserializing counterpart to `static` heap_fixed_builder_config().  It is mostly provided for consistency,</span></div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span><span class="comment">   * as it simply returns `Heap_reader::Config(logger_ptr)`.</span></div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span><span class="comment">   *</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span><span class="comment">   *        Logger to pass to the returned `Config`.</span></div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno">  771</span><span class="comment">   */</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a411feb974e2b7ed48b08ac50bcdf43b3">  772</a></span>  <span class="keyword">static</span> <a class="code hl_struct" href="structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html">transport::struc::Heap_reader::Config</a> <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a411feb974e2b7ed48b08ac50bcdf43b3">heap_reader_config</a>(flow::log::Logger* logger_ptr);</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span><span class="comment"></span> </div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno">  775</span><span class="comment">   * Deserializing counterpart to non-`static` heap_fixed_builder_config().  It is mostly provided for consistency,</span></div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span><span class="comment">   * as it simply returns `Heap_reader::Config(L)`, where `L` is the Flow `Logger*` belonging to `*this` Session.</span></div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span><span class="comment">   *</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span><span class="comment">   */</span></div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ab3c69e3f8ccbd70d315bed86d697255d">  780</a></span>  <a class="code hl_struct" href="structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html">transport::struc::Heap_reader::Config</a> <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#ab3c69e3f8ccbd70d315bed86d697255d">heap_reader_config</a>();</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span><span class="comment"></span> </div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span><span class="comment">   * Returns logger (possibly null).</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span><span class="comment">   */</span></div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a142df6d6db09962a1dc0f536bf4977f0">  786</a></span>  flow::log::Logger* <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a142df6d6db09962a1dc0f536bf4977f0">get_logger</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span><span class="comment"></span> </div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span><span class="comment">   * Returns log component.</span></div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span><span class="comment">   */</span></div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a23b43187319871c4974755175973008e">  792</a></span>  <span class="keyword">const</span> flow::log::Component&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a23b43187319871c4974755175973008e">get_log_component</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span> </div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno">  794</span><span class="keyword">protected</span>:</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span><span class="comment"></span> </div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span><span class="comment">  /// Short-hand for #Impl&#39;s Session_base super-class.</span></div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#acb47dfa0f5645cf2da7d62ac5862e8cc">  798</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#acb47dfa0f5645cf2da7d62ac5862e8cc">Session_base_obj</a> = <span class="keyword">typename</span> Impl::Session_base_obj;</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno">  799</span><span class="comment"></span> </div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span><span class="comment">  /// Short-hand for `const`-respecting wrapper around #Impl for the pImpl idiom.  See impl().</span></div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a457c661352bf3111ca4f707c15d51b3e">  801</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a457c661352bf3111ca4f707c15d51b3e">Impl_ptr</a> = std::experimental::propagate_const&lt;boost::movelib::unique_ptr&lt;Impl&gt;&gt;;</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span> </div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno">  803</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno">  804</span><span class="comment"></span> </div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno">  806</span><span class="comment">   * Provides `const` access to Session_base super-object.</span></div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno">  807</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span><span class="comment">   */</span></div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a7589e9e086afae1d8be969c8e6c1987d">  809</a></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#acb47dfa0f5645cf2da7d62ac5862e8cc">Session_base_obj</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a7589e9e086afae1d8be969c8e6c1987d">base</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno">  810</span><span class="comment"></span> </div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno">  811</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno">  812</span><span class="comment">   * pImpl target; particularly for sub-classes that must add to the above `public` API.</span></div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno">  813</span><span class="comment">   * @return See above.  May be null; namely if `*this` is as-if default-cted.</span></div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno">  814</span><span class="comment">   */</span></div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ae5e646ae3649914384cb2e7f94aa7a25">  815</a></span>  <a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a457c661352bf3111ca4f707c15d51b3e">Impl_ptr</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#ae5e646ae3649914384cb2e7f94aa7a25">impl</a>();</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno">  816</span><span class="comment"></span> </div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno">  817</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno">  818</span><span class="comment">   * pImpl target; particularly for sub-classes that must add to the above `public` API.</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno">  819</span><span class="comment">   * @return See above.  May be null; namely if `*this` is as-if default-cted.</span></div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno">  820</span><span class="comment">   */</span></div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a025cd4b449dbfc68008ac9379a07ca63">  821</a></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a457c661352bf3111ca4f707c15d51b3e">Impl_ptr</a>&amp; <a class="code hl_function" href="classipc_1_1session_1_1Session__mv.html#a025cd4b449dbfc68008ac9379a07ca63">impl</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno">  822</span> </div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno">  823</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno">  824</span>  <span class="comment">// Friends.</span></div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno">  825</span><span class="comment"></span> </div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno">  826</span><span class="comment">  /// Friend of Session_mv.</span></div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno">  827</span><span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Session_impl_t2&gt;</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a3db0af35c4944b80b0ee4119298ae548">  828</a></span>  <span class="keyword">friend</span> std::ostream&amp; <a class="code hl_friend" href="classipc_1_1session_1_1Session__mv.html#a3db0af35c4944b80b0ee4119298ae548">operator&lt;&lt;</a>(std::ostream&amp; os,</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno">  829</span>                                  <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv&lt;Session_impl_t2&gt;</a>&amp; val);</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno">  830</span> </div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno">  831</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno">  832</span><span class="comment"></span> </div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno">  833</span><span class="comment">  /// The true implementation of this class.  See also our class doc header.</span></div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ae1b726126c99bb55036f8c0c2ad6640f">  834</a></span><span class="comment"></span>  <a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a457c661352bf3111ca4f707c15d51b3e">Impl_ptr</a> <a class="code hl_variable" href="classipc_1_1session_1_1Session__mv.html#ae1b726126c99bb55036f8c0c2ad6640f">m_impl</a>;</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno">  835</span>}; <span class="comment">// class Session_mv</span></div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno">  836</span> </div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno">  837</span><span class="comment">// Free functions: in *_fwd.hpp.</span></div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno">  838</span> </div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno">  839</span><span class="comment">// Template implementations (strict pImpl-idiom style (albeit pImpl-lite due to template-ness)).</span></div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno">  840</span><span class="comment"></span> </div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno">  841</span><span class="comment">/// Internally used macro; public API users should disregard (same deal as in struc/channel.hpp).</span></div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"><a class="line" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">  842</a></span><span class="comment"></span><span class="preprocessor">#define TEMPLATE_SESSION_MV \</span></div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno">  843</span><span class="preprocessor">  template&lt;typename Session_impl_t&gt;</span><span class="comment"></span></div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno">  844</span><span class="comment">/// Internally used macro; public API users should disregard (same deal as in struc/channel.hpp).</span></div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"><a class="line" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#ae75d4feea6a31d1856dee263c3812114">  845</a></span><span class="comment"></span><span class="preprocessor">#define CLASS_SESSION_MV \</span></div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno">  846</span><span class="preprocessor">  Session_mv&lt;Session_impl_t&gt;</span></div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno">  847</span> </div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno">  848</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ae5e646ae3649914384cb2e7f94aa7a25">  849</a></span><span class="keyword">typename</span> CLASS_SESSION_MV::Impl_ptr&amp; CLASS_SESSION_MV::impl()</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno">  850</span>{</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno">  851</span>  <span class="keywordflow">return</span> m_impl;</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno">  852</span>}</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno">  853</span> </div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno">  854</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a025cd4b449dbfc68008ac9379a07ca63">  855</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_SESSION_MV::Impl_ptr&amp; CLASS_SESSION_MV::impl()<span class="keyword"> const</span></div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno">  856</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno">  857</span>  <span class="keywordflow">return</span> m_impl;</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno">  858</span>}</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno">  859</span> </div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno">  860</span><span class="comment">// The performant move semantics we get delightfully free with pImpl; they&#39;ll just move-to/from the unique_ptr m_impl.</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno">  861</span> </div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno">  862</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno">  863</span>CLASS_SESSION_MV::Session_mv(<a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno">  864</span> </div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno">  865</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno">  866</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#ae75d4feea6a31d1856dee263c3812114">CLASS_SESSION_MV</a>&amp; CLASS_SESSION_MV::operator=(<a class="code hl_class" href="classipc_1_1session_1_1Session__mv.html">Session_mv</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno">  867</span> </div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno">  868</span><span class="comment">// The default ctor comports with how null m_impl is treated all over below.</span></div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno">  869</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno">  870</span>CLASS_SESSION_MV::Session_mv() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno">  871</span> </div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno">  872</span><span class="comment">// The rest is strict forwarding to impl() (when not null).</span></div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno">  873</span> </div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno">  874</span><span class="comment">// It&#39;s only explicitly defined to formally document it.</span></div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno">  875</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno">  876</span>CLASS_SESSION_MV::~Session_mv() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno">  877</span> </div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno">  878</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a749f1f679f858d2dce8562cdddc60195">  879</a></span><span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1session.html#ade2b302f1a3623e8adc9694568d94d2c">Session_token</a>&amp; CLASS_SESSION_MV::session_token()<span class="keyword"> const</span></div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno">  880</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno">  881</span>  <span class="keywordflow">return</span> impl() ? impl()-&gt;session_token() : <a class="code hl_variable" href="namespaceipc_1_1transport_1_1struc.html#ad556d20a2aa2d52b83c7afb73951d47d">transport::struc::NULL_SESSION_TOKEN</a>;</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno">  882</span>}</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno">  883</span> </div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno">  884</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#aba79f245e6f726ac6aa573e45e0bfdf3">  885</a></span><span class="keyword">typename</span> CLASS_SESSION_MV::Mdt_builder_ptr CLASS_SESSION_MV::mdt_builder()</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno">  886</span>{</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno">  887</span>  <span class="keywordflow">return</span> impl() ? impl()-&gt;mdt_builder() : <a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a787253f02859ea6b99ce3eba92766431">Mdt_builder_ptr</a>();</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno">  888</span>}</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno">  889</span> </div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno">  890</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a6d8cdbb86140056a7e7d2931ea642b18">  891</a></span><span class="keywordtype">bool</span> CLASS_SESSION_MV::open_channel(<a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#ab92df09d894e6e1aaf3c2733da594fd2">Channel_obj</a>* target_channel, <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#a787253f02859ea6b99ce3eba92766431">Mdt_builder_ptr</a>&amp; mdt,</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno">  892</span>                                    <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno">  893</span>{</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno">  894</span>  <span class="keywordflow">return</span> impl() ? impl()-&gt;open_channel(target_channel, mdt, err_code) : <span class="keyword">false</span>;</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno">  895</span>}</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno">  896</span> </div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno">  897</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a84e80e24d7b16da0a9ecf83057acfd8e">  898</a></span><span class="keywordtype">bool</span> CLASS_SESSION_MV::open_channel(<a class="code hl_typedef" href="classipc_1_1session_1_1Session__mv.html#ab92df09d894e6e1aaf3c2733da594fd2">Channel_obj</a>* target_channel, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno">  899</span>{</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno">  900</span>  <span class="keywordflow">return</span> impl() ? impl()-&gt;open_channel(target_channel, err_code) : <span class="keyword">false</span>;</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno">  901</span>}</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno">  902</span> </div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno">  903</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno">  904</span><a class="code hl_struct" href="structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html">transport::struc::Heap_fixed_builder::Config</a></div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a26dfe4dd3ff57daab5a36a037f835c4e">  905</a></span>  CLASS_SESSION_MV::heap_fixed_builder_config(flow::log::Logger* logger_ptr) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno">  906</span>{</div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno">  907</span>  <span class="keywordflow">return</span> Impl::heap_fixed_builder_config(logger_ptr);</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno">  908</span>}</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno">  909</span> </div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno">  910</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno">  911</span><a class="code hl_struct" href="structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html">transport::struc::Heap_fixed_builder::Config</a></div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a107684fdd5d233549c6daac26a81a542">  912</a></span>  CLASS_SESSION_MV::heap_fixed_builder_config()</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno">  913</span>{</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno">  914</span>  <span class="keywordflow">return</span> Impl::heap_fixed_builder_config(impl() ? impl()-&gt;get_logger() : <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno">  915</span>}</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno">  916</span> </div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno">  917</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno">  918</span><a class="code hl_struct" href="structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html">transport::struc::Heap_reader::Config</a></div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a411feb974e2b7ed48b08ac50bcdf43b3">  919</a></span>  CLASS_SESSION_MV::heap_reader_config(flow::log::Logger* logger_ptr) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno">  920</span>{</div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno">  921</span>  <span class="keywordflow">return</span> Impl::heap_reader_config(logger_ptr);</div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno">  922</span>}</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno">  923</span> </div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno">  924</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno">  925</span><a class="code hl_struct" href="structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html">transport::struc::Heap_reader::Config</a></div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#ab3c69e3f8ccbd70d315bed86d697255d">  926</a></span>  CLASS_SESSION_MV::heap_reader_config()</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno">  927</span>{</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno">  928</span>  <span class="keywordflow">return</span> Impl::heap_reader_config(impl() ? impl()-&gt;get_logger() : <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno">  929</span>}</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno">  930</span> </div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno">  931</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a142df6d6db09962a1dc0f536bf4977f0">  932</a></span>flow::log::Logger* CLASS_SESSION_MV::get_logger()<span class="keyword"> const</span></div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno">  933</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno">  934</span>  <span class="keywordflow">return</span> impl()-&gt;get_logger();</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno">  935</span>}</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno">  936</span> </div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno">  937</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a23b43187319871c4974755175973008e">  938</a></span><span class="keyword">const</span> flow::log::Component&amp; CLASS_SESSION_MV::get_log_component()<span class="keyword"> const</span></div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno">  939</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno">  940</span>  <span class="keywordflow">return</span> impl()-&gt;get_log_component();</div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno">  941</span>}</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno">  942</span> </div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno">  943</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a7589e9e086afae1d8be969c8e6c1987d">  944</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_SESSION_MV::Session_base_obj&amp; CLASS_SESSION_MV::base()<span class="keyword"> const</span></div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno">  945</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno">  946</span>  assert(impl() &amp;&amp; <span class="stringliteral">&quot;Session default ctor is meant only for being moved-to.  Internal bug?&quot;</span>);</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno">  947</span>  <span class="keywordflow">return</span> impl()-&gt;base();</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno">  948</span>}</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno">  949</span> </div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno">  950</span><a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"><a class="line" href="classipc_1_1session_1_1Session__mv.html#a07c2d7a228f070e32bf4f1fbc64e1f6d">  951</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceipc_1_1session.html#a6b2f9a90ac9cc5098d9b90e7f547c97e">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_define" href="ipc__session_2src_2ipc_2session_2session_8hpp.html#ae75d4feea6a31d1856dee263c3812114">CLASS_SESSION_MV</a>&amp; val)</div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno">  952</span>{</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno">  953</span>  <span class="keywordflow">if</span> (val.impl())</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno">  954</span>  {</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno">  955</span>    <span class="keywordflow">return</span> os &lt;&lt; *val.impl();</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno">  956</span>  }</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno">  957</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno">  958</span>  <span class="keywordflow">return</span> os &lt;&lt; <span class="stringliteral">&quot;null&quot;</span>;</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno">  959</span>}</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno">  960</span> </div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno">  961</span><span class="preprocessor">#undef CLASS_SESSION_MV</span></div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno">  962</span><span class="preprocessor">#undef TEMPLATE_SESSION_MV</span></div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno">  963</span> </div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno">  964</span>} <span class="comment">// namespace ipc::session</span></div>
<div class="ttc" id="aclassSession__impl__t_html"><div class="ttname"><a href="classSession__impl__t.html">Session_impl_t</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html">ipc::session::Session_mv</a></div><div class="ttdoc">Implements the Session concept when it is in PEER state.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00504">session.hpp:505</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a025cd4b449dbfc68008ac9379a07ca63"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a025cd4b449dbfc68008ac9379a07ca63">ipc::session::Session_mv::impl</a></div><div class="ttdeci">const Impl_ptr &amp; impl() const</div><div class="ttdoc">pImpl target; particularly for sub-classes that must add to the above public API.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00855">session.hpp:855</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a0b4f0cdde3221b0922e0b44cbb6011a2"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a0b4f0cdde3221b0922e0b44cbb6011a2">ipc::session::Session_mv::~Session_mv</a></div><div class="ttdeci">~Session_mv()</div><div class="ttdoc">Implements Session API per contract.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a107684fdd5d233549c6daac26a81a542"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a107684fdd5d233549c6daac26a81a542">ipc::session::Session_mv::heap_fixed_builder_config</a></div><div class="ttdeci">transport::struc::Heap_fixed_builder::Config heap_fixed_builder_config()</div><div class="ttdoc">Utility that obtains a heap-based (non-zero-copy) Struct_builder::Config, constructed with the most e...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00912">session.hpp:912</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a1293a6369b78d12bad869ca812be0f74"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a1293a6369b78d12bad869ca812be0f74">ipc::session::Session_mv::Session_mv</a></div><div class="ttdeci">Session_mv(const Session_mv &amp;)=delete</div><div class="ttdoc">Copy ction is disallowed.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a142df6d6db09962a1dc0f536bf4977f0"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a142df6d6db09962a1dc0f536bf4977f0">ipc::session::Session_mv::get_logger</a></div><div class="ttdeci">flow::log::Logger * get_logger() const</div><div class="ttdoc">Returns logger (possibly null).</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00932">session.hpp:932</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a23b43187319871c4974755175973008e"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a23b43187319871c4974755175973008e">ipc::session::Session_mv::get_log_component</a></div><div class="ttdeci">const flow::log::Component &amp; get_log_component() const</div><div class="ttdoc">Returns log component.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00938">session.hpp:938</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a26dfe4dd3ff57daab5a36a037f835c4e"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a26dfe4dd3ff57daab5a36a037f835c4e">ipc::session::Session_mv::heap_fixed_builder_config</a></div><div class="ttdeci">static transport::struc::Heap_fixed_builder::Config heap_fixed_builder_config(flow::log::Logger *logger_ptr)</div><div class="ttdoc">Utility that obtains a heap-based (non-zero-copy) Struct_builder::Config, constructed with the most e...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00905">session.hpp:905</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a2b1215fb0c9738b9fcfbb337d23c43df"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a2b1215fb0c9738b9fcfbb337d23c43df">ipc::session::Session_mv::Mdt_reader_ptr</a></div><div class="ttdeci">typename Impl::Mdt_reader_ptr Mdt_reader_ptr</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00546">session.hpp:546</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a335c3585402cc9430f8c909e8c7e55f4"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a335c3585402cc9430f8c909e8c7e55f4">ipc::session::Session_mv::Structured_msg_reader_config</a></div><div class="ttdeci">typename Impl::Structured_msg_builder_config Structured_msg_reader_config</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00582">session.hpp:582</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a3db0af35c4944b80b0ee4119298ae548"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a3db0af35c4944b80b0ee4119298ae548">ipc::session::Session_mv::operator&lt;&lt;</a></div><div class="ttdeci">friend std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Session_mv&lt; Session_impl_t2 &gt; &amp;val)</div><div class="ttdoc">Friend of Session_mv.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a411feb974e2b7ed48b08ac50bcdf43b3"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a411feb974e2b7ed48b08ac50bcdf43b3">ipc::session::Session_mv::heap_reader_config</a></div><div class="ttdeci">static transport::struc::Heap_reader::Config heap_reader_config(flow::log::Logger *logger_ptr)</div><div class="ttdoc">Deserializing counterpart to static heap_fixed_builder_config().</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00919">session.hpp:919</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a457c661352bf3111ca4f707c15d51b3e"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a457c661352bf3111ca4f707c15d51b3e">ipc::session::Session_mv::Impl_ptr</a></div><div class="ttdeci">std::experimental::propagate_const&lt; boost::movelib::unique_ptr&lt; Impl &gt; &gt; Impl_ptr</div><div class="ttdoc">Short-hand for const-respecting wrapper around Impl for the pImpl idiom. See impl().</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00801">session.hpp:801</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a62945e465ae734523036215750c90ba4"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a62945e465ae734523036215750c90ba4">ipc::session::Session_mv::S_SHM_ENABLED</a></div><div class="ttdeci">static constexpr bool S_SHM_ENABLED</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00596">session.hpp:596</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a6a87002dccab497da76bb286d5a4bf95"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a6a87002dccab497da76bb286d5a4bf95">ipc::session::Session_mv::S_MQS_ENABLED</a></div><div class="ttdeci">static constexpr bool S_MQS_ENABLED</div><div class="ttdoc">Compile-time-known constant indicating whether Channel_obj shall use a blobs pipe over message queues...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00599">session.hpp:599</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a6d8cdbb86140056a7e7d2931ea642b18"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a6d8cdbb86140056a7e7d2931ea642b18">ipc::session::Session_mv::open_channel</a></div><div class="ttdeci">bool open_channel(Channel_obj *target_channel, const Mdt_builder_ptr &amp;mdt, Error_code *err_code=0)</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00891">session.hpp:891</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a749f1f679f858d2dce8562cdddc60195"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a749f1f679f858d2dce8562cdddc60195">ipc::session::Session_mv::session_token</a></div><div class="ttdeci">const Session_token &amp; session_token() const</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00879">session.hpp:879</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a74af091662cb7c32e0f1c60baac3613b"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a74af091662cb7c32e0f1c60baac3613b">ipc::session::Session_mv::S_SHM_TYPE</a></div><div class="ttdeci">static constexpr schema::ShmType S_SHM_TYPE</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00590">session.hpp:590</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a7589e9e086afae1d8be969c8e6c1987d"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a7589e9e086afae1d8be969c8e6c1987d">ipc::session::Session_mv::base</a></div><div class="ttdeci">const Session_base_obj &amp; base() const</div><div class="ttdoc">Provides const access to Session_base super-object.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00944">session.hpp:944</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a787253f02859ea6b99ce3eba92766431"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a787253f02859ea6b99ce3eba92766431">ipc::session::Session_mv::Mdt_builder_ptr</a></div><div class="ttdeci">typename Impl::Mdt_builder_ptr Mdt_builder_ptr</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00540">session.hpp:540</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a84e80e24d7b16da0a9ecf83057acfd8e"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a84e80e24d7b16da0a9ecf83057acfd8e">ipc::session::Session_mv::open_channel</a></div><div class="ttdeci">bool open_channel(Channel_obj *target_channel, Error_code *err_code=0)</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00898">session.hpp:898</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_a9f6e9a57f6e6ab420d554a2c0eba7877"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#a9f6e9a57f6e6ab420d554a2c0eba7877">ipc::session::Session_mv::Structured_msg_builder_config</a></div><div class="ttdeci">typename Impl::Structured_msg_builder_config Structured_msg_builder_config</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00573">session.hpp:573</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_ab3c69e3f8ccbd70d315bed86d697255d"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#ab3c69e3f8ccbd70d315bed86d697255d">ipc::session::Session_mv::heap_reader_config</a></div><div class="ttdeci">transport::struc::Heap_reader::Config heap_reader_config()</div><div class="ttdoc">Deserializing counterpart to non-static heap_fixed_builder_config().</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00926">session.hpp:926</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_ab92df09d894e6e1aaf3c2733da594fd2"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#ab92df09d894e6e1aaf3c2733da594fd2">ipc::session::Session_mv::Channel_obj</a></div><div class="ttdeci">typename Impl::Channel_obj Channel_obj</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00519">session.hpp:519</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_aba79f245e6f726ac6aa573e45e0bfdf3"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#aba79f245e6f726ac6aa573e45e0bfdf3">ipc::session::Session_mv::mdt_builder</a></div><div class="ttdeci">Mdt_builder_ptr mdt_builder()</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00885">session.hpp:885</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_ac000e14183b5dcb523ff0eaaf030968c"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#ac000e14183b5dcb523ff0eaaf030968c">ipc::session::Session_mv::operator=</a></div><div class="ttdeci">Session_mv &amp; operator=(Session_mv &amp;&amp;src)</div><div class="ttdoc">Implements Session API per contract.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_ac205819d4a3a066f31b5af311ff40a2a"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#ac205819d4a3a066f31b5af311ff40a2a">ipc::session::Session_mv::Structured_channel</a></div><div class="ttdeci">typename transport::struc::Channel_via_heap&lt; Channel_obj, Message_body &gt; Structured_channel</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00563">session.hpp:564</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_acb47dfa0f5645cf2da7d62ac5862e8cc"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#acb47dfa0f5645cf2da7d62ac5862e8cc">ipc::session::Session_mv::Session_base_obj</a></div><div class="ttdeci">typename Impl::Session_base_obj Session_base_obj</div><div class="ttdoc">Short-hand for Impl's Session_base super-class.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00798">session.hpp:798</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_acccbc643f29f002075e66cd134da70bd"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#acccbc643f29f002075e66cd134da70bd">ipc::session::Session_mv::Mdt_payload_obj</a></div><div class="ttdeci">typename Impl::Mdt_payload_obj Mdt_payload_obj</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00528">session.hpp:528</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_ad1cffabdbc41809399b4bda9330f5367"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#ad1cffabdbc41809399b4bda9330f5367">ipc::session::Session_mv::Session_mv</a></div><div class="ttdeci">Session_mv(Session_mv &amp;&amp;src)</div><div class="ttdoc">Implements Session API per contract.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_addc597e6bf3555dc3788116c8cc179dd"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#addc597e6bf3555dc3788116c8cc179dd">ipc::session::Session_mv::S_SOCKET_STREAM_ENABLED</a></div><div class="ttdeci">static constexpr bool S_SOCKET_STREAM_ENABLED</div><div class="ttdoc">Compile-time-known constant indicating whether Channel_obj shall use socket stream for any type of pi...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00607">session.hpp:607</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_ae1b726126c99bb55036f8c0c2ad6640f"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#ae1b726126c99bb55036f8c0c2ad6640f">ipc::session::Session_mv::m_impl</a></div><div class="ttdeci">Impl_ptr m_impl</div><div class="ttdoc">The true implementation of this class. See also our class doc header.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00834">session.hpp:834</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_ae5e646ae3649914384cb2e7f94aa7a25"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#ae5e646ae3649914384cb2e7f94aa7a25">ipc::session::Session_mv::impl</a></div><div class="ttdeci">Impl_ptr &amp; impl()</div><div class="ttdoc">pImpl target; particularly for sub-classes that must add to the above public API.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00849">session.hpp:849</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_aeb7d7965c0fc0736b6c59f5f81a3e8c2"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#aeb7d7965c0fc0736b6c59f5f81a3e8c2">ipc::session::Session_mv::operator=</a></div><div class="ttdeci">Session_mv &amp; operator=(const Session_mv &amp;)=delete</div><div class="ttdoc">Copy assignment is disallowed.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_af10f452e602e4ea7389c6a77dd9a0f88"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#af10f452e602e4ea7389c6a77dd9a0f88">ipc::session::Session_mv::Mdt_builder</a></div><div class="ttdeci">typename Impl::Mdt_builder Mdt_builder</div><div class="ttdoc">Implements Session API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00534">session.hpp:534</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_af87da439644b2afd73d6a13d97e7985f"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#af87da439644b2afd73d6a13d97e7985f">ipc::session::Session_mv::Channels</a></div><div class="ttdeci">typename Impl::Channels Channels</div><div class="ttdoc">Container (vector&lt;&gt;) of Channel_obj.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00522">session.hpp:522</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session__mv_html_af964cb260766684d46503b43d0faa777"><div class="ttname"><a href="classipc_1_1session_1_1Session__mv.html#af964cb260766684d46503b43d0faa777">ipc::session::Session_mv::Session_mv</a></div><div class="ttdeci">Session_mv()</div><div class="ttdoc">Implements Session API per contract.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html"><div class="ttname"><a href="classipc_1_1session_1_1Session.html">ipc::session::Session</a></div><div class="ttdoc">A documentation-only concept defining the local side of an IPC conversation (session) with another en...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00215">session.hpp:216</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a08416c5a34aa4eb58db094e946b540e3"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a08416c5a34aa4eb58db094e946b540e3">ipc::session::Session::Session</a></div><div class="ttdeci">Session()</div><div class="ttdoc">Default ctor: creates Session in NULL state (not operational).</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a230afdc0889f869e3b0606a826115745"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a230afdc0889f869e3b0606a826115745">ipc::session::Session::Session</a></div><div class="ttdeci">Session(Session &amp;&amp;src)</div><div class="ttdoc">Move ctor: *this becomes identical to src; while src becomes as-if default-cted.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a2612cefeace1ba12e649ba0e509aaab1"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a2612cefeace1ba12e649ba0e509aaab1">ipc::session::Session::Structured_msg_builder_config</a></div><div class="ttdeci">unspecified Structured_msg_builder_config</div><div class="ttdoc">Convenience alias equal to Structured_channel&lt;M&gt;::Builder_config (regardless of M).</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00300">session.hpp:300</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a2ee877327fded2c2b1978453831c2b1b"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a2ee877327fded2c2b1978453831c2b1b">ipc::session::Session::Mdt_builder_ptr</a></div><div class="ttdeci">shared_ptr&lt; Mdt_builder &gt; Mdt_builder_ptr</div><div class="ttdoc">Ref-counted handle to a capnp-generated Builder (and the payload it accesses) through which the user ...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00251">session.hpp:252</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a2f770785552536f3b929f293c44834d2"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a2f770785552536f3b929f293c44834d2">ipc::session::Session::Channel_obj</a></div><div class="ttdeci">unspecified Channel_obj</div><div class="ttdoc">Each successful open_channel() and on-passive-open handler firing shall yield a concrete transport::C...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00235">session.hpp:235</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a420df732069ded1feef423adf7a30915"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a420df732069ded1feef423adf7a30915">ipc::session::Session::mdt_builder</a></div><div class="ttdeci">Mdt_builder_ptr mdt_builder()</div><div class="ttdoc">Returns a new metadata holder to be subsequently mutated by the user and then passed to open_channel(...</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a611bf472626baa35d3e6cd661735d953"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a611bf472626baa35d3e6cd661735d953">ipc::session::Session::Session</a></div><div class="ttdeci">Session(const Session &amp;)=delete</div><div class="ttdoc">Copy construction is disallowed.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a62a1a415a92bf6e0b4d83987394ae78b"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a62a1a415a92bf6e0b4d83987394ae78b">ipc::session::Session::S_SHM_TYPE</a></div><div class="ttdeci">static constexpr schema::ShmType S_SHM_TYPE</div><div class="ttdoc">Specifies the SHM-provider for which this Session concept implementation provides support; or NONE if...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00320">session.hpp:320</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a7f28ff5d2fc6e9830877979fafe48cf7"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a7f28ff5d2fc6e9830877979fafe48cf7">ipc::session::Session::S_SHM_ENABLED</a></div><div class="ttdeci">static constexpr bool S_SHM_ENABLED</div><div class="ttdoc">Specifies whether this Session concept implementation provides support for zero-copy via SHM plus dir...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00329">session.hpp:329</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_a8cb20f446c2a4327a3a8143af137dbca"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#a8cb20f446c2a4327a3a8143af137dbca">ipc::session::Session::~Session</a></div><div class="ttdeci">~Session()</div><div class="ttdoc">In NULL state, no-op; in PEER state: Ends the session while informing (if possible) the opposing peer...</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_aa3e921f8f06a051423c60ba2f2736dde"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#aa3e921f8f06a051423c60ba2f2736dde">ipc::session::Session::operator=</a></div><div class="ttdeci">Session &amp; operator=(Session &amp;&amp;src)</div><div class="ttdoc">Move assignment: acts as-if *this dtor executed; then *this becomes identical to src; while src becom...</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_aab01aefa0243abf84c7cc36d3ab2d852"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#aab01aefa0243abf84c7cc36d3ab2d852">ipc::session::Session::open_channel</a></div><div class="ttdeci">bool open_channel(Channel_obj *target_channel, const Mdt_builder_ptr &amp;mdt, Error_code *err_code=0)</div><div class="ttdoc">Synchronously active-opens a new channel which, on success, is moved-to *target_channel.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_abc6ce8839621c1e19db80ccd4f2e2589"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#abc6ce8839621c1e19db80ccd4f2e2589">ipc::session::Session::session_token</a></div><div class="ttdeci">const Session_token &amp; session_token() const</div><div class="ttdoc">In PEER state: Returns the (non-nil) logged-in session token to be used for any struc::Channels one m...</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_ac23d047087984addf221f0baa0058616"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#ac23d047087984addf221f0baa0058616">ipc::session::Session::Structured_msg_reader_config</a></div><div class="ttdeci">unspecified Structured_msg_reader_config</div><div class="ttdoc">Convenience alias equal to Structured_channel&lt;M&gt;::Reader_config (regardless of M).</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00308">session.hpp:308</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_ac3f52804db8ecf1d0dc0d0bbdf97e062"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#ac3f52804db8ecf1d0dc0d0bbdf97e062">ipc::session::Session::Mdt_builder</a></div><div class="ttdeci">typename transport::struc::schema::Metadata&lt; Mdt_payload_obj &gt;::Builder Mdt_builder</div><div class="ttdoc">Pointee of Mdt_builder_ptr.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00241">session.hpp:242</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_ae197d051e06be6f132e193e9ba7ab6ae"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#ae197d051e06be6f132e193e9ba7ab6ae">ipc::session::Session::Mdt_reader_ptr</a></div><div class="ttdeci">shared_ptr&lt; typename transport::struc::schema::Metadata&lt; Mdt_payload_obj &gt;::Reader &gt; Mdt_reader_ptr</div><div class="ttdoc">Ref-counted handle to a capnp-generated Reader (and the payload it accesses) through which the user s...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00261">session.hpp:262</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_aee51c401ffff7cc66787c566d734f8e3"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#aee51c401ffff7cc66787c566d734f8e3">ipc::session::Session::operator=</a></div><div class="ttdeci">Session &amp; operator=(const Session &amp;)=delete</div><div class="ttdoc">Copy assignment is disallowed.</div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_af572e522f2e85258bdfd091fd6e9a58b"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#af572e522f2e85258bdfd091fd6e9a58b">ipc::session::Session::Mdt_payload_obj</a></div><div class="ttdeci">Mdt_payload Mdt_payload_obj</div><div class="ttdoc">Short-hand for Mdt_payload template arg.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00238">session.hpp:238</a></div></div>
<div class="ttc" id="aclassipc_1_1session_1_1Session_html_afd8c8f5e2c71c2c4c58f77f134aa076c"><div class="ttname"><a href="classipc_1_1session_1_1Session.html#afd8c8f5e2c71c2c4c58f77f134aa076c">ipc::session::Session::open_channel</a></div><div class="ttdeci">bool open_channel(Channel_obj *target_channel, Error_code *err_code=0)</div><div class="ttdoc">Identical to open_channel(target_channel, mdt_builder(), err_code); in other words attempts to open c...</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Channel_html"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Channel.html">ipc::transport::struc::Channel</a></div><div class="ttdoc">Owning and wrapping a pre-connected transport::Channel peer (an endpoint of an established channel ov...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8hpp_source.html#l00580">channel.hpp:583</a></div></div>
<div class="ttc" id="aheap__serializer_8hpp_html"><div class="ttname"><a href="heap__serializer_8hpp.html">heap_serializer.hpp</a></div></div>
<div class="ttc" id="aipc__session_2src_2ipc_2session_2session_8hpp_html_aa9659b660994645cb26d232d9fc64133"><div class="ttname"><a href="ipc__session_2src_2ipc_2session_2session_8hpp.html#aa9659b660994645cb26d232d9fc64133">TEMPLATE_SESSION_MV</a></div><div class="ttdeci">#define TEMPLATE_SESSION_MV</div><div class="ttdoc">Internally used macro; public API users should disregard (same deal as in struc/channel....</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00842">session.hpp:842</a></div></div>
<div class="ttc" id="aipc__session_2src_2ipc_2session_2session_8hpp_html_ae75d4feea6a31d1856dee263c3812114"><div class="ttname"><a href="ipc__session_2src_2ipc_2session_2session_8hpp.html#ae75d4feea6a31d1856dee263c3812114">CLASS_SESSION_MV</a></div><div class="ttdeci">#define CLASS_SESSION_MV</div><div class="ttdoc">Internally used macro; public API users should disregard (same deal as in struc/channel....</div><div class="ttdef"><b>Definition:</b> <a href="ipc__session_2src_2ipc_2session_2session_8hpp_source.html#l00845">session.hpp:845</a></div></div>
<div class="ttc" id="anamespaceipc_1_1session_html"><div class="ttname"><a href="namespaceipc_1_1session.html">ipc::session</a></div><div class="ttdoc">Flow-IPC module providing the broad lifecycle and shared-resource organization – via the session conc...</div><div class="ttdef"><b>Definition:</b> <a href="app_8cpp_source.html#l00026">app.cpp:27</a></div></div>
<div class="ttc" id="anamespaceipc_1_1session_html_a6b2f9a90ac9cc5098d9b90e7f547c97e"><div class="ttname"><a href="namespaceipc_1_1session.html#a6b2f9a90ac9cc5098d9b90e7f547c97e">ipc::session::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const App &amp;val)</div><div class="ttdoc">Prints string representation of the given App to the given ostream.</div><div class="ttdef"><b>Definition:</b> <a href="app_8cpp_source.html#l00124">app.cpp:124</a></div></div>
<div class="ttc" id="anamespaceipc_1_1session_html_ade2b302f1a3623e8adc9694568d94d2c"><div class="ttname"><a href="namespaceipc_1_1session.html#ade2b302f1a3623e8adc9694568d94d2c">ipc::session::Session_token</a></div><div class="ttdeci">transport::struc::Session_token Session_token</div><div class="ttdoc">Convenience alias for the commonly used type transport::struc::Session_token.</div><div class="ttdef"><b>Definition:</b> <a href="session__fwd_8hpp_source.html#l00248">session_fwd.hpp:248</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_1_1classic_html_abfde278018c84aa1542475e9a4089c29"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#abfde278018c84aa1542475e9a4089c29">ipc::transport::struc::shm::classic::Builder</a></div><div class="ttdeci">Builder&lt; ipc::shm::classic::Pool_arena &gt; Builder</div><div class="ttdoc">Convenience alias: transport::struc::shm::Builder that works with boost.ipc.shm pools from ipc::shm::...</div><div class="ttdef"><b>Definition:</b> <a href="transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html#l00036">classic_fwd.hpp:36</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_1_1classic_html_af94f8698ca62a84d6366aaa931375d41"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#af94f8698ca62a84d6366aaa931375d41">ipc::transport::struc::shm::classic::Reader</a></div><div class="ttdeci">Reader&lt; ipc::shm::classic::Pool_arena &gt; Reader</div><div class="ttdoc">Convenience alias: transport::struc::shm::Reader that works with boost.ipc.shm pools from ipc::shm::c...</div><div class="ttdef"><b>Definition:</b> <a href="transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html#l00039">classic_fwd.hpp:39</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_html_ad556d20a2aa2d52b83c7afb73951d47d"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc.html#ad556d20a2aa2d52b83c7afb73951d47d">ipc::transport::struc::NULL_SESSION_TOKEN</a></div><div class="ttdeci">const Session_token NULL_SESSION_TOKEN</div><div class="ttdoc">A value for which .is_nil() is true.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8cpp_source.html#l00035">channel.cpp:35</a></div></div>
<div class="ttc" id="anamespaceipc_html_aa3192e586cc45d3e7c22463bf2760f89"><div class="ttname"><a href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">ipc::Error_code</a></div><div class="ttdeci">flow::Error_code Error_code</div><div class="ttdoc">Short-hand for flow::Error_code which is very common.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00298">common.hpp:298</a></div></div>
<div class="ttc" id="asession__fwd_8hpp_html"><div class="ttname"><a href="session__fwd_8hpp.html">session_fwd.hpp</a></div></div>
<div class="ttc" id="astructipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config_html"><div class="ttname"><a href="structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html">ipc::transport::struc::Heap_fixed_builder::Config</a></div><div class="ttdoc">Implements Struct_builder::Config sub-concept.</div><div class="ttdef"><b>Definition:</b> <a href="heap__serializer_8hpp_source.html#l00154">heap_serializer.hpp:155</a></div></div>
<div class="ttc" id="astructipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config_html"><div class="ttname"><a href="structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html">ipc::transport::struc::Heap_reader::Config</a></div><div class="ttdoc">Implements Struct_reader::Config sub-concept.</div><div class="ttdef"><b>Definition:</b> <a href="heap__serializer_8hpp_source.html#l00332">heap_serializer.hpp:333</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 11 2025 20:02:26 for Flow-IPC by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
